package config

import (
	"go.uber.org/zap"
	"gopkg.in/yaml.v3"
	"gorm.io/driver/mysql"
	"os"
	"time"
)

// ServerConfig 定义服务器配置结构体
type ServerConfig struct {
	NeedMockData         bool                 `yaml:"need_mock_data"`        // 是否需要模拟数据
	HttpAddr             string               `yaml:"http_addr"`             // HTTP 服务器监听地址
	MySqlC               *mysql.Config        `yaml:"mysql"`                 // MySQL 配置
	LogLevel             string               `yaml:"log_level"`             // 日志级别
	LogPath              string               `yaml:"log_path"`              // 日志文件路径
	SuperRoleName        string               `yaml:"super_role_name"`       // 超管角色的名称，避免大家定义的不一致
	PublicCloudSyncC     *PublicCloudSync     `yaml:"public_cloud_sync"`     // ESC同步配置
	ErrLogPath           string               `yaml:"err_log_path"`          // 错误日志文件路径
	JWTC                 *JWT                 `yaml:"jwt"`                   // JWT配置
	ImDingDingC          *ImDingDingConf      `yaml:"im_ding_ding"`          // 钉钉配置
	WorkOrderAutoActionC *WorkOrderAutoAction `yaml:"workorder_auto_action"` // 工单自动执行配置
	GrpcServerConfigC    *GrpcServerConfig    `yaml:"grpc_server_config"`    // gRPC配置
	JobExecC             *ServerJobExec       `yaml:"job_exec"`              // 任务执行配置
	StreeCacheC          *StreeCache          `yaml:"stree_cache"`
	MonitorComputeC      *MonitorCompute      `yaml:"monitor_compute"`
	Logger               *zap.Logger          `yaml:"-"`            // 不是配置文件中的字段，而是共用配置文件这个结构体，在生成完logger后设置的
	Domain               string               `yaml:"front_domain"` // 前端域名
}

// 服务树缓存配置
type StreeCache struct {
	Enable             bool `yaml:"enable"`
	RunIntervalSeconds int  `yaml:"run_interval_seconds"`
}

// JWT配置
type JWT struct {
	SingingKey      string        `yaml:"singing_key"`     // JWT签名 密码加盐
	ExpireTime      string        `yaml:"expire_time"`     // 过期时间
	ExpiresDuration time.Duration `yaml:"-"`               // 解析配置文件你的时候set的
	BufferTime      string        `yaml:"buffer_time"`     // 临期时间
	BufferDuration  time.Duration `yaml:"buffer_duration"` // 临期时间
	Issuers         string        `yaml:"issuers"`         // JWT签发者
}

// ESC同步配置
type PublicCloudSync struct {
	Enable             bool        `yaml:"enable"`
	RunIntervalSeconds int         `yaml:"run_interval_seconds"`
	AliCloud           []*AliCloud `yaml:"ali_cloud"`
	// 为了mock本地数据用的
	MockResourceFixedNum int `yaml:"mock_resource_fixed_num"`
	MockResourceRandNum  int `yaml:"mock_resource_rand_num"`
}

// 阿里云配置
type AliCloud struct {
	//		client, err := sdk.NewClientWithAccessKey("REGION_ID", "ACCESS_KEY_ID", "ACCESS_KEY_SECRET")
	Enable          bool   `yaml:"enable"`
	RegionId        string `yaml:"region_id"`
	AccessKeyId     string `yaml:"access_key_id"`
	AccessKeySecret string `yaml:"access_key_secret"`
}

// 钉钉配置
type ImDingDingConf struct {
	BotApiAddr   string   `yaml:"bot_api_addr"` // 机器人api地址,如:https://oapi.dingtalk.com/robot/send
	Title        string   `yaml:"title"`
	AtMobiles    []string `yaml:"atMobiles"`
	Access_Token string   `yaml:"access_token"` // 钉钉的access_token
	Secret       string   `yaml:"secret"`       // 钉钉的secret  // 请替换为你的密钥 获取方式https://blog.csdn.net/supersolon/article/details/133911505
}

// 工单自动执行模块
type WorkOrderAutoAction struct {
	Enable                   bool   `yaml:"enable"`
	ServiceAccount           string `yaml:"service_account" `            // 服务账号名称
	DetailUrl                string `yaml:"detail_url"`                  // 详情url地址
	RunIntervalSeconds       int    `yaml:"run_interval_seconds"`        // 执行间隔
	NotifyRunIntervalSeconds int    `yaml:"notify_run_interval_seconds"` // 通知执行间隔
	BatchNum                 int    `yaml:"batch_num"`                   // 每次执行的数量
	AutoTemplateNameBuyEcs   string `yaml:"auto_template_name_buyecs"`   // 购买ecs的自动执行模板
	AutoTemplateNameRmEcs    string `yaml:"auto_template_name_rmecs"`    // 删除ecs的自动执行模板
}

// 监控计算配置结构体
type MonitorCompute struct {
	Enable             bool   `yaml:"enable"`
	RunIntervalSeconds int    `yaml:"run_interval_seconds"`
	ExecTimeoutSeconds int    `yaml:"execTimeoutSeconds"`
	HttpSdApi          string `yaml:"httpSdApi"`
	AlertWebHookAddr   string `yaml:"alertWebHookAddr"`
}

type GrpcServerConfig struct {
	Addr string `yaml:"addr"`
}

type ServerJobExec struct {
	Enable             bool `yaml:"enable"`
	RunIntervalSeconds int  `yaml:"run_interval_seconds"`
	ExecTimeoutSeconds int  `yaml:"execTimeoutSeconds"`
}

// 根据IO read 读取配置文件后的字符串解析yaml
func LoadServer(filename string) (*ServerConfig, error) {
	cfg := &ServerConfig{}
	content, err := os.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	err = yaml.Unmarshal(content, cfg)
	if err != nil {
		return nil, err
	}

	// 解析JWTC的过期时间
	exd, err := time.ParseDuration(cfg.JWTC.ExpireTime)
	if err != nil {
		return nil, err
	}

	bud, err := time.ParseDuration(cfg.JWTC.ExpireTime)
	if err != nil {
		return nil, err
	}

	cfg.JWTC.ExpiresDuration = exd
	cfg.JWTC.BufferDuration = bud
	return cfg, nil

}
